package main

import (
	"bufio"
	"fmt"
	"io"
	"io/ioutil"
	"os"
	"os/exec"
	"path"
	"strings"
)

// 文件操作

func main() {
	// 获取 go 安装目录
	cmd := exec.Command("go", "env", "GOROOT")
	out, _ := cmd.Output()
	goPath := strings.Replace(string(out), "\n", "", -1)

	f, err := os.Open(path.Join(goPath, "LICENSE"))
	if err != nil {
		fmt.Println(err)
		os.Exit(-1)
	}
	defer func() {
		_ = f.Close()
	}()

	// 原始方法读取文件
	for {
		// 读文件
		buf := make([]byte, 256)
		read, err := f.Read(buf)
		if err == io.EOF {
			fmt.Println("读取完毕")
			break
		}
		if err != nil {
			return
		}

		fmt.Printf("读取 %d 字节, 内容 => \n%s \n", read, buf)
	}

	// 重置文件指针
	_, _ = f.Seek(0, 0)

	fmt.Println("=========================================================")

	// bufio 读取文件
	reader := bufio.NewReader(f)
	for {
		line, err := reader.ReadString('\n')
		if err == io.EOF {
			fmt.Println("读取完毕")
			break
		}
		if err != nil {
			return
		}

		fmt.Printf("读取内容 => \n%s", line)
	}

	_, _ = f.Seek(0, 0)

	fmt.Println("=========================================================")

	// 使用 ioutil 读取整个文件
	buf, _ := ioutil.ReadAll(f)
	fmt.Printf("读取内容 => \n%s", buf)
}
